#define _CRT_SECURE_NO_WARNINGS 1

// STL标准库
// string类

// string的设计其实是更不成熟的，它毕竟严格意义上不属于STL
// 它是探路的


#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

//void test_string1()
//{
//	// 常用
//	string s1;
//	string s2("Hello,world!");
//	string s3(s2);
//
//	// 不常用，了解
//	string s4(s2, 3, 5); // 有多少拷多少，如果没有第三个参数的话
//	string s5(s2, 3);
//	string s6(s2, 3, 30);
//	string s7("Hello,world!", 5);
//	string s8(10, 'x');
//
//
//	cout << s1 << endl;
//	cout << s2 << endl;
//	cout << s3 << endl;
//	cout << s4 << endl;
//	cout << s5 << endl;
//	cout << s6 << endl;
//	cout << s7 << endl;
//	cout << s8 << endl;
//
//	//cin >> s1;
//	//cout << s1 << endl;
//}
//
//void test_string2()
//{
//	// 隐式类型转换
//	string s2 = "Hello,world!";
//	const string& s3 = "Hello,world!";
//}
//
//void test_string3()
//{
//	string s1("Hello,world!");
//	
//	// 没有任何的不同，不算\0
//	cout << s1.size() << endl;
//	cout << s1.length() << endl;
//
//	for (size_t i = 0; i < s1.size(); i++) {
//		cout << s1[i] << " ";
//	}
//	cout << endl;
//
//	for (size_t i = 0; i < s1.size(); i++) {
//		s1[i]++;
//		cout << s1[i] << " ";
//	}
//	cout << endl;
//}

//// 修改返回值，在这里的主要作用
//class string
//{
//	char& operator[](size_t i)
//	{
//		assert(i < _size);
//		return _str[i];
//	}
//private:
//	char* _str;
//	size_t _size;
//	size_t _capacity;
//};

//// 权限只可以平移或者缩小，不可以放大
//
//// 编译器会优先匹配更适合的
//// 可读可写
//char& operator[](size_t pos);
//const char& operator[](size_t pos); const
//
//// 只读不写
//size_t size() const;

// 迭代器，把它暂时想象成指针
// 它是主流的通用的访问方式
// 但是对于string来说，下标确实方便一些
void test_string4()
{
	string s1("Hello,world!");

	string::iterator it1 = s1.begin();
	while (it1 != s1.end()) {
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
}

void test_string5()
{
	const string s1("Hello,world!");
	string::const_iterator it1 = s1.begin(); // 保证迭代器指向的内容不能修改

	while (it1 != s1.end()) {
		//*it1 = 'x'; // err

		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
}

// 反向迭代器
void test_string6()
{
	string s1("Hello,world!");

	/*string::reverse_iterator it1 = s1.rbegin();*/
	auto it1 = s1.rbegin();
	while (it1 != s1.rend())
	{
		cout << *it1 << " ";
		it1++; //运算符重载
	}
	cout << endl;
}

void test_string7()
{
	string s1("Hello,world!");
	cout << s1 << endl;

	sort(s1.begin(), s1.begin() + 5);
	cout << s1 << endl;
}

void test_string8()
{
	string s1("Hello,world!");
	cout << s1 << endl;

	// 少用，时间复杂度高
	// 头插很奇怪
	string s2(s1);
	s2.insert(0, "xxx");
	cout << s2 << endl;
}

void test_string9()
{
	string s1("Hello,world!");
	cout << s1 << endl;

	//s1.erase(1);
	//s1.erase(2, 500);
	cout << s1 << endl;
}



//int main()
//{
//	string str("hello world");
//	cout << str.size() << endl;
//	cout << str.capacity() << endl;
//	cout << endl;
//
//	str.resize(100);
//	cout << str.size() << endl;
//	cout << str.capacity() << endl;
//	cout << endl;
//
//	str.shrink_to_fit();
//	cout << str.size() << endl;
//	cout << str.capacity() << endl;
//	cout << endl;
//
//	return 0;
//}

//class Solution {
//public:
//	string addStrings(string num1, string num2)
//	{
//		string ret;
//
//		auto it1 = num1.rbegin();
//		auto it2 = num2.rbegin();
//
//		int carry = 0, count = 0;
//		// string num1 = "456", num2 = "77";
//		while (it1 != num1.rend() && it2 != num2.rend()) {
//			int n1 = *it1 - '0', n2 = *it2 - '0';
//			count = n1 + n2 + carry;
//
//			carry = count / 10;
//			count %= 10;
//
//			ret += (char)(count + '0');
//			it1++, it2++;
//		}
//
//		while (it1 != num1.rend()) {
//			int n1 = *it1 - '0';
//			count = n1 + carry;
//
//			carry = count / 10;
//			count %= 10;
//
//			ret += (char)(count + '0');
//			it1++;
//		}
//
//		while (it2 != num2.rend()) {
//			int n2 = *it2 - '0';
//			count = n2 + carry;
//
//			carry = count / 10;
//			count %= 10;
//
//			ret += (char)(count + '0');
//			it2++;
//		}
//
//		if (carry == 1) ret += '1';
//		reverse(ret.begin(), ret.end());
//
//		return ret;
//	}
//};
//
//int main()
//{
//	string num1 = "11", num2 = "123";
//	cout << Solution().addStrings(num1, num2) << endl;
//
//	return 0;
//}

int main()
{
	

	return 0;
}